#include "tablebase.h"

#include <QDebug>

//前面拆分界面文本为 QStringList, 交由这函数, 找出表的开始和结束位值, 以及光标对应的在 QStringList的第几行.
//返回 三个结果: 表开始, 表结束, 光标台后行.
//原函数就可以对表进行各种操作了.
int 找表位置(QStringList html字符列表, int 光标台前行, int *表开始, int *表结束, int *行, int *列)
{
   int 光标台后行=-1;


   int index=-1;
   for(int i=0, j=0; i<html字符列表.length(); i++)//找出 光标台前行 对应的 光标台后行
   {
        index=html字符列表[i].indexOf("<p ");
        int index2=html字符列表[i].indexOf("</td>");
        if(index2 != -1  && index ==-1)//这是空的表格行,没有<p>标签的情况
        {
            j++;
            if(j>光标台前行)//问题: 为什么要用大于?  不用就是光标的前一行了.
            {
                光标台后行=i;
                break;
            }
        }

        if(index !=-1)
        {
            j++;
            //qDebug()<<"光标台后行g"<<j<<i<<html字符列表[i];
            if(j>光标台前行)//问题: 为什么要用大于?  不用就是光标的前一行了.
            {

                光标台后行=i;
                break;
            }
        }
   }

   if(光标台后行 == -1)//表格是最后, 光标在表格外, 应报错.
   {
       return 光标台后行;
   }


 qDebug()<<"光标后aa"<<光标台前行<<光标台后行<<html字符列表.length();
   index=-1;
   if(html字符列表.length() > 光标台后行)
   {
   for(int i=光标台后行; i>0; i--)
   {
        index=html字符列表[i].indexOf("<table ");
         if(index !=-1)
         {
             *表开始=i;
             break;
         }
   }
   }

   index=-1;
   for(int i=光标台后行; i<html字符列表.length(); i++)//找出 表结束
   {
        index=html字符列表[i].indexOf("</table>");
         if(index !=-1)
         {
             *表结束=i;
             break;
         }
   }


   if(*表开始>=*表结束)
   {
        光标台后行=-1;
        return 光标台后行;
   }

   if(*表开始==0)
   {
        光标台后行=-1;
        return 光标台后行;
   }


    //int 行=0, 列=0;//行++; 列++;
    index=-1;
    bool 未开完列数=true;
    for(int i=光标台后行; i>0 ; i--)
    {
        if(未开完列数)
        {
            index=html字符列表[i].indexOf("<td>");
            if(index != -1)
            {
                *列+=1;
            }
            index=-1;
            index=html字符列表[i].indexOf("<tr>");
            if(index != -1)
            {
                未开完列数=false;
                i+=1;//回退一行
            }
        }
        if(!未开完列数)//找完了列数
        {
            index=-1;
            index=html字符列表[i].indexOf("<tr>");
            if(index != -1)
            {
                *行+=1;
            }
            index=-1;
            index=html字符列表[i].indexOf("<table ");
            if(index != -1)
            {
                break;
            }
        }
    }
    // qDebug()<<"行列ag"<< *行 << *列 <<html字符列表[光标台后行];


    return 光标台后行;
}


QStringList 规范化表格(QStringList 表格区域)
{
    QStringList 规范化后表格;
//取出 <tr></tr>之间的元素

//<table border="1" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px;" cellspacing="0" cellpadding="0">
//<tr>
//<td>
//<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">一</p></td>
//<td>
//<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">二</p></td>
//<td>
//<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">三</p></td>
//<td>
//<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">四</p></td></tr></table>

//处理成下面的格式, 中间的就是一行的列数, 最前和最后是表格的开标签和结束标签, 中间是表格的行
//<table border="1" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px;" cellspacing="0" cellpadding="0">
//<tr>
//<td><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">一</p></td>
//<td><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">二</p></td>
//<td><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">三</p></td>
//<td><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">四</p></td>
//</tr>
//</table>

    QString 表格文本;
    for(int i=0; i<表格区域.length(); i++)//列表转字符, 连续的更好处理
    {
        表格文本+=表格区域[i];
    }

    int index1=-1, index2=-1, index3=-1, index4=-1;

//qDebug()<<"表格文本cbb"<<表格文本;

    index1=表格文本.indexOf("<table ");
    index2=表格文本.indexOf(">");
    规范化后表格.append(表格文本.mid(index1,index2+1));
    表格文本=表格文本.mid(index2+1,表格文本.length()-index2-1);
//qDebug()<<"表格文本cccc"<<表格文本;

    while(1)//怎么停
    {
        index1=表格文本.indexOf("<tr>");
        index2=表格文本.indexOf("<td>");
        index3=表格文本.indexOf("</td>");
       // index4=表格文本.indexOf("</tr>");
        if(index3 !=-1 && index1<index2 && index1!=-1)
        {

            规范化后表格.append("<tr>");
            规范化后表格.append(表格文本.mid(index2,index3+1));//<td></td>区间, 减4加5=1, 是结束符长度
          //  qDebug()<<"循环jjj"<<表格文本.mid(index2,index3+1);
            表格文本=表格文本.mid(index3+5,表格文本.length()-index3-5);
        }

        if(index3 !=-1 && (index1>index2 || index1== -1))
        {
            规范化后表格.append(表格文本.mid(index2,index3+5));//<td></td>区间, +5是结束符长度
            表格文本=表格文本.mid(index3+5,表格文本.length()-index3-5);
        }

        index3=表格文本.indexOf("</td>");
        index4=表格文本.indexOf("</tr>");
        if(index3>index4 || index3==-1)//index3>index4 是</td>在</tr>的后面, 表明这一行该结束了.  index3==-1表明已没有</td>, 整个表格都结束了.
        {
            index4=表格文本.indexOf("</tr>");
            if(index4 != -1)
            {
                规范化后表格.append("</tr>");
                表格文本=表格文本.mid(index4+5,表格文本.length()-index4-5);
            }
        }
        if(index4==-1 && index3==-1)
        {
            规范化后表格.append("</table>");
            break;
        }
       // qDebug()<<"循环cb"<<index1<<index2<<index3<<index4;
    }

qDebug()<<"光标后ab"<<表格文本<<index1<<index2<<index3<<index4;

   return 规范化后表格;

}



QStringList 表格操作(QStringList 表格区域, QString 操作类型,int 行,int 列)
{
//处理成下面的格式, 中间的就是一行的列数, 最前和最后是表格的开标签和结束标签, 中间是表格的行
//<table border="1" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px;" cellspacing="0" cellpadding="0">
//<tr>
//<td><p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">囧</span></p></td>
//<td><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">一</p></td>
//<td><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">一</p></td>
//<td><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">一</p></td>
//</tr>
//</table>


    int index=-1;
    int 列数=0;
    //算一下有多少列
    for(int i =0; i<表格区域.length(); i++)
    {
        index=表格区域[i].indexOf("<td>");
        if(index !=-1)
        {   列数++;   }
        index=表格区域[i].indexOf("</tr>");
        if(index !=-1)
        {   break;   }
    }
    int 行数=0;
    //算一下有多少行
    for(int i =0; i<表格区域.length(); i++)
    {
        index=表格区域[i].indexOf("</tr>");
        if(index !=-1)
        {   行数++;   }
        index=表格区域[i].indexOf("</table>");
        if(index !=-1)
        {   break;   }
    }

    qDebug()<<"表的行与列aa"<<行数<<列数;


if(操作类型=="增加一行")
{
    int 行计数=0;
    for(int i =0; i<表格区域.length(); i++)
    {
        index=表格区域[i].indexOf("</tr>");
        if(index != -1)
        {
            行计数++;
        }
        if(行计数 == 行)//开始插入行
        {
            i++;
            表格区域.insert(i, "<tr>");
            i++;
            for(int j=0; j<列数; j++)
            {
                表格区域.insert(i, "<td></td>");
                i++;
            }
            表格区域.insert(i, "</tr>");
            break;
        }
    }
    return 表格区域;
}

if(操作类型=="增加一列")
{
    bool 第一行已插入=false;
    for(int i =0; i<表格区域.length(); i++)
    {
        index=表格区域[i].indexOf("<tr>");
        if(index != -1)
        {
            for(int j=0; j<列数; )
            {
                i++;
                index=表格区域[i].indexOf("</td>");
                if(index != -1)
                {
                   j++;
                }
                if(j==列)
                {
                    if(!第一行已插入)
                    {
                       表格区域.insert(i+1, "<td>一</td>");//第一行插入个 "一", 用来保持宽度
                       第一行已插入=true;
                    }
                    else
                    { 表格区域.insert(i+1, "<td></td>");}

                    break;
                }
            }
        }
        index=表格区域[i].indexOf("</table>");
        if(index != -1)
        {
            break;
        }
    }
    return 表格区域;
}


if(操作类型=="删除当前行")
{
    int 遇到行计数=0;
    for(int i =0; i<表格区域.length(); i++)
    {
        index=表格区域[i].indexOf("<tr>");
        if(index != -1)
        {
            遇到行计数++;
        }
        if(遇到行计数==行)
        {
            for(;i<表格区域.length();)
            {
                 index=表格区域[i].indexOf("</tr>");
                 表格区域.removeAt(i);//删除QStringList中的元素
                 if(index != -1)
                 {  break; }
            }
            break;
        }
    }

    //检测表格是否全部删除了
    bool 全部删除了=true;
    for(int i =0; i<表格区域.length(); i++)
    {
        index=表格区域[i].indexOf("<tr>");
        if(index != -1)
        {
            全部删除了=false;
            break;
        }
    }
    if(全部删除了)//如果全部表都删除了, 返回个空字符列表
    {
        表格区域.clear();
        return 表格区域;
    }
    return 表格区域;
}


if(操作类型=="删除当前列")
{

    for(int i =0; i<表格区域.length(); i++)
    {
        int 遇到列计数=0;
        index=表格区域[i].indexOf("<tr>");
        if(index != -1)
        {
            for(int j=0; j<列数; j++)
            {
                i++;
                index=表格区域[i].indexOf("</td>");
                if(index != -1)
                {
                    遇到列计数++;
                }
                if(遇到列计数==列)
                {
                    表格区域.removeAt(i);//删除QStringList中的元素
                    break;
                }

            }
        }
        index=表格区域[i].indexOf("</table>");
        if(index != -1)
        {
            break;
        }
    }

    //检测表格是否全部删除了
    bool 全部删除了=true;
    for(int i =0; i<表格区域.length(); i++)
    {
        index=表格区域[i].indexOf("<tr>");
        if(index != -1)
        {
            全部删除了=false;
            break;
        }
    }
    if(全部删除了)//如果全部表都删除了, 返回个空字符列表
    {
        表格区域.clear();
        return 表格区域;
    }
    return 表格区域;
}





    return 表格区域;

}









